﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace CommonClasses.Services
{
    /// <summary>
    /// Описание виртуальной машины
    /// </summary>
    public interface IVirtualMachineService
    {
        /// <summary>
        /// Зарегистрировать в Lua .Net-объект, к которому можно будет обращаться из Lua-кода
        /// </summary>
        /// <param name="path">Имя, с которым будет зарегистрирован объект</param>
        /// <param name="obj">Объект</param>
        void RegisterObject(string path, object obj);

        /// <summary>
        /// Зарегистрировать в Lua актора, код которого будет исполняться
        /// </summary>
        /// <param name="actor">Актор</param>
        void RegisterActiveObject(object actor);

        /// <summary>
        /// Зарегистрировать новую таблицу в корневой таблице Lua.
        /// </summary>
        /// <param name="tableName">Имя новой таблицы</param>
        void RegisterTable(string tableName);

        /// <summary>
        /// Удалить из Lua актора
        /// </summary>
        /// <param name="actor"></param>
        void UnRegisterActiveObject(object actor);

        /// <summary>
        /// Удалить из Lua актора по его имени (поддерживается уникальность имен)
        /// </summary>
        /// <param name="actor"></param>
        void UnRegisterActiveObjectByName(string name);

        /// <summary>
        /// Содержит ли актор про имени actorName
        /// </summary>
        /// <param name="actorName">имя актора</param>
        /// <returns></returns>
        bool ContainsActorByName(string actorName);

        /// <summary>
        /// Начать выполнение
        /// </summary>
        void Begin();

        /// <summary>
        /// Принудительно закончить выполнение
        /// </summary>
        void End();

        /// <summary>
        /// Для каждого из акторов выполнить часть его программы (до вызова сопроцедуры)
        /// </summary>
        void ProcessOneStep();

        /// <summary>
        /// Выполнить команду сразу (синхронно).
        /// </summary>
        /// <param name="command">Lua-код</param>
        void ExecuteCommandNow(string command);

        /// <summary>
        /// Вызывается при окончании выполнения - когда выполнены все сопроцедуры
        /// </summary>
        event MethodInvoker OnAllCoroutineDead;

        /// <summary>
        /// Вызывается при выполнении функции аварийной остановки
        /// </summary>
        event MethodInvoker OnTerminateAll;
    }
}
